package com.example.leetcode.solution;

/**
 * 6. Z 字形变换
 * 将一个给定字符串根据给定的行数，以从上往下、从左到右进行 Z 字形排列。
 *
 * 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时，排列如下：
 *
 * L   C   I   R
 * E T O E S I I G
 * E   D   H   N
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："LCIRETOESIIGEDHN"。
 *
 * 请你实现这个将字符串进行指定行数变换的函数：
 *
 * string convert(string s, int numRows);
 * 示例 1:
 *
 * 输入: s = "LEETCODEISHIRING", numRows = 3
 * 输出: "LCIRETOESIIGEDHN"
 * 示例 2:
 *
 * 输入: s = "LEETCODEISHIRING", numRows = 4
 * 输出: "LDREOEIIECIHNTSG"
 * 解释:
 *
 * L     D     R
 * E   O E   I I
 * E C   I H   N
 * T     S     G
 */
public class Solution6 {
    public String convert(String s, int numRows) {
        int offset = 2;
        if (numRows == 1) {
            return s;
        }
        int cols = numRows - offset;
        int combox = cols + 1;
        int i2 = s.length() / (numRows + cols);
        if(s.length() % (numRows + cols) != 0){
            i2++;
        }
        int all = i2 * combox;
        String[][] matrix = new String[numRows][all];
        int charIndex = 0;
        int index = numRows - offset;
        for (int j = 0; j < all; j++) {
            int i1 = j / combox;
            if (j % combox == 0) {
                for (int i = 0; i < numRows; i++) {
                    if (charIndex < s.length()) {
                        matrix[i][i1 * combox] = String.valueOf(s.charAt(charIndex));
                        charIndex++;
                    }
                }
            } else {
                if (index == 0) {
                    index = numRows - offset;
                }
                if (charIndex < s.length()) {
                    for (int i = 0; i < numRows; i++) {
                        if (i == index) {
                            matrix[i][j] = String.valueOf(s.charAt(charIndex));
                        }
                    }
                    charIndex++;
                }
                index--;
            }
        }
        StringBuffer result = new StringBuffer();
        for (String[] rows : matrix) {
            for (String row : rows) {
                if (row != null && !" ".equals(row)) {
                    result.append(row);
                }
            }
        }
        return result.toString();
    }
}